﻿using System;
using System.Collections.Generic;
using System.Linq;
using DiNinject.EfModel;
using DiNinject.Repository.Interfaces;

namespace DiNinject.Repository.Implementation
{
    public class PersonRespository : IPersonRespository
    {
        #region Initialize
        public PersonRespository(IModelContainer modelContainer)
        {
            if (modelContainer == null)
            {
                throw  new NullReferenceException("ModelContainer ist Null.");
            }

            _modelContainer = modelContainer;
        }

        private IModelContainer _modelContainer;
        #endregion

        #region Interfaces Impl.
        /// <summary>
        /// Laden Aller Personen
        /// </summary>
        public List<Person> AllPersons()
        {
            return _modelContainer.EFModelContainer.PersonSet.ToList();
        }

        /// <summary>
        /// Erstellen oder aktualisieren des übergebenen PersonenObjektes
        /// </summary>
        /// <param name="person">Das PersonenObjekt, welches aktualisiert bzw. angelegt werden soll</param>
        public Person AddOrUpdatePerson(Person person)
        {
            if (person.Id == 0)
            {
                //Eine Neue Person anlegen
                _modelContainer.EFModelContainer.PersonSet.Add(person);
            }
            else
            {
                //Person existiert bereits, dann laden und aktualisieren
                var pers = Load(person.Id);
                if (pers != null)
                {
                    //Mappen der Properties evtl. auch mit Automapper!
                    pers.Alter = person.Alter;
                    pers.Benutzername = person.Benutzername;
                    pers.Vorname = person.Vorname;
                    pers.Nachname = person.Nachname;
                }
            }

            _modelContainer.EFModelContainer.SaveChanges();
            return person;
        }

        /// <summary>
        /// Laden der Person für die übergebene Id
        /// </summary>
        /// <param name="id">Id der Person die geladen werden soll</param>
        public Person Load(int id)
        {
            return _modelContainer.EFModelContainer.PersonSet.FirstOrDefault(p => p.Id == id);
        }
        #endregion
    }
}
